�����������������������������������������������������������������������������U � [x] RingZ3r0 Proudly Presents [x] � � U����������������������������������������������������������� � 3 Il Reversing di un programma Visual Basic 5 3 aLoNg3x 12 Marzo 1999 --==[ PREMESSA ]==-------------------------------------------------------- LE INFORMAZIONI CHE TROVATE ALL'INTERNO DI QUESTO FILE SONO PER PURO SCOPO DIDATTICO. L'AUTORE NON INCORAGGIA CHI VOLESSE UTILIZZARLO PER SCOPI ILLEGALI. --==[ DIFFICOLTA' ]==-------------------------------------------------------- scala : *=Novizio, **=Apprendista, ***=Esperto, ****=Guru target: N/R --==[ TOOLS USATI ]==-------------------------------------------------------- * Softice (Numega) * Come al solito un cervello in buone condizioni :) --==[ INTRODUZIONE ]==-------------------------------------------------------- Best viewed with old m$-do$ EditoR... Salve a tutti, con questa guida cerchero' di spiegare un primo tipo di approccio rispetto alle protezioni di programmi scritti con il VB (arghhhh) scherzo.. Bill ;) Infatti normalmente il metodo utilizzato e' diverso da quello tradizionale dato che gli eseguibili del Vb per far qualsiasi tipo di operazione fanno sempre riferimento a delle librerie di funzioni standard. Nel caso del Visual Basic 5 alla MsVbVm50.Dll (size: 1.347.344) --==[ LET'S GO :p ]==-------------------------------------------------------- Come spero gia' saprete disassemblando con il Wdasm l'exe non si ottiene alcuna valida informazione dalle string references, quindi partiremo da un approccio live con il Softice... Puo' comunque risultare utile salvare il disassemblato per poi osservare con calma le parti piu' "interessanti" del programma. Il programma in questione e' un utilita' per inserire nei motori di ricerca principali il vostro sito, si chiama "Dynamic Submission" (v. 4.031) prodotto dalla Apex Pacific, comunque penso che questa procedura possa risultare comune a molti programmi e non ritengo quindi necessaria una spiegazione specifica. Spero che alla fine di questa spiegazione sarete in grado di comprendere la protezione di una gran parte dei programmi in VB :) A mio parere la prima cosa da fare consiste nell'inserire nel winice.dat la dll del vb dalla quale verranno importati i symbols che ci consentiranno facilmente di inserire "bpx" sulle funzioni che a noi interessano... ; ***** Examples of export symbols that can be included for Windows 95 ***** ; Change the path to the appropriate drive and directory EXP=c:\windows\system\kernel32.dll EXP=c:\windows\system\user32.dll EXP=c:\windows\system\gdi32.dll EXP=c:\windows\system\msvbvm50.dll <--- Questa riga e' quella che ci serve... Riavviate quindi il PC caricando il caro Sice in memoria... Fate partire il vostro programma target entrando nella finestra che vi chiede i dati per la registrazione... In questo prog. ci sono 4 campi: - Series no. - Register Code "-.class" tppabs="http://www.crackstore.com/tutorz/-.class" Registered Name (scopriremo in seguito che questi due campi non servono - Organisation a niente ai fini della registrazione...) Infatti tutto il check si basa sui primi 2 campi. Scrivete i vostri dati preferiti (cercate di ricordarveli, dato che vi saranno utili se li "beccate in giro" per la memoria...) Prendete ora il programma PeBrowse e fate un bel Load dell'eseguibile in questione... osservate attentamente la scheda delle funzioni importate... Fate scorrere tutta la lista cercando di stare bene attenti :) E' a mio parere fondamentale la "__vbaStrCmp" utilizzata dai progs in Vb per confrontare due stringhe... Normalmente i programmatori un po' sensati cercano di usare qualche trucchetto per evitare (o per mascherare) questa funzione che vi fa comparire in memoria i parametri passati che sono solitamente molto interessanti... o no ?? ;) Invece in questo caso non ci sono strani problemi.. e tutto fila liscio come spesso avviene... Entrate quindi in Sice e settate un bpx sulla funzione __vbaStrCmp (se non sapete usare questi comandi fondamentali, leggetevi una guida) tornate a Win e premete il pulsante register... Se avete fortuna il sice dovrebbe "breakkare" (se cio' non avvenisse allora vi conviene dare un bello sguardo alle functions importate e cercare quale potrebbe essere quella giusta, continuando comunque a sperare di non aver beccato un bravo programmatore che vi sta facendo perdere un sacco di tempo con trukketti vari.. ;p Se invece tutto e' andato nel migliore dei modi vi dovreste trovare alla prima istruzione della funzione __vbaStrCmp all'interno della DLL di VB... premete quindi F11 per giungere fino al ret della func. e tornare quindi al nostro caro .exe Nel caso di questo programma, vado avanti un po' a "steppare" giungendo fino ad un test eax,eax seguito da un jmp condizionale... Una tecnica che io spesso utilizzo per reversare i progs consiste nel modificare l'EIP in modo da invertire l'effetto del jmp in modo tale da vedere una possibile finestra di messaggio che mi puo' fornire importanti informazioni, anche perche' non ho il supporto "off-line" delle string references" del wdasm... In questo caso invertendo gli effetti del jmp mi appare una segnalazione che indica di inserire i miei dati personali, c'e' quindi un semplice controllo se ho inserito ho meno il nome. Nota: __vbaStrCmp riceve due parametri che confronta... eax = 0 = uguali 1 = diversi Guardate anche dove ci sono i due push prima della funzione e vedrete che i valori pushati puntano in memoria alla locazione della stringa del nome e ad una stringa nulla. Capito ??? :) Ok, ora mettiamo sempre valori a caso e clikkiamo nuovamente per registrarci, il sice brekka per il solito primo controllo, premiamo F5 per rimandare in RUN e incrociando le dita troviamo un secondo break... ottimo :) Ripremente F5 in modo tale da vedere il messaggio che vi annuncia che il SN e' sbagliato... Rifate tutta 'sta procedura ma ora uscite dal secondo break con F11 e settate un bpx poco prima della seconda chiamata alla __vbaStrCmp Nel mio caso c'e' una call prima della quale viene pushato un parametro... Se vado a debuggarci sopra scopro che quello e' il series no. e la func mi ritorna in eax (in CHIARO) il register code per quel numero seriale :) Questo parametro in eax viene poi pushato prima della String Compare e se andate una decina di righe prima a guardare, scoprirete anche il push del codice che noi avevamo inserito... in poche parole quindi alla funzione di compare son passati due parametri: 1 - Il Codice di Registrazione da noi inserito 2 - Il codice corretto (generato dalla call alla quale viene passato il SN) Siamo quindi quasi giunti alla fine... ("Era ora !!!" direte voi... :) Ora possediamo il codice di registrazione corretto... possiamo quindi usare quello oppure modificare la call di generazione in modo tale da farle tornare magari un Codice identico al numero seriale... La cosa importante e' comunque aver imparato nuove cose riguardo alla tecniche di protezione di programmi scritti in Vb. Una piccola osservazione: Se andate un attimo a smanettare con il regedit, scoprirete una cartellina relativa a questo programma con dentro i dati rigurdanti la registrazione... Ci sono da notare 3 cose piuttosto importanti: 1) Modificando Nome e Organizzazione non succede un cazzo... 2) Abbiamo la possibilita' di cambiare il numero seriale... (ovviamente poi il codice che abbiamo non andra' piu' bene.... 3) MOLTO importante: quei coglionazzi dei programmatori hanno lasciato una variabile booleana idiota che chekka se il prog. e' registrato o meno.. 0 ==> Registrato 1 ==> Evaluation Sigh.... mi viene da piangere a vedere certe cazzate.... se fossi il proprietario di questa S-house licenzierei i coders all'istante e assumerei il "buon" aLoNg3x ;))) che ne dite ? :p --==[ NOTE FINALI ]==--------------------------------------------------------- Spero che questo tute vi sia stato d'aiuto.... segnalatemi se c'e' qualche errore o qualche altra minchiata.... Se volete ulteriori spiegazioni, scrivetemi a: aLoNg3x --- along3x@geocities.com Ricordate comunque di non usare le vostre conoscenze a fini illegali.... Ringrazio come al solito tutto il gruppo Ringzer0 e tutti quelli che mi danno sempre una mano... (un grazie anche a Samp3i... lui sa perche':) Saluto tutti gli amici del chan #crack-it e tutti quelli conosco che magari fanno parte di altri gruppi :) Infine suggerisco a tutti di ascoltare i Lag-wagon... il migliore gruppo musicale del mondo ! (state tranquilli.. non mi passano una percentuale... ;) Ciauz. "...Le poete est semblable au prince des nu�es Qui hante la tempete et se rit de l'archer; Exil� sur le sol au milieu des hu�es. Ses ailes de g�ant l'empechent de marcher." Tratto da "L'Albatros" --- Charles Baudelaire --==[ EOF ]==--------------------------------------------------------